
namespace ShoppingCart.WebSite.Admin
{
    using System;
    using System.Configuration;
    using System.IO;
    using System.Linq;
    using System.Web.Security;
    using System.Web.UI;
    using Business.Logic;
    using Code;
    using DTO = Business.Entity;

    public partial class Cliente : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack) return;
            LoadDepartamentos();
            CargarAccion();
        }

        protected void DdlDepartamentoSelectedIndexChanged(object sender, EventArgs e)
        {
            LoadProvincias(Convert.ToInt32(ddlDepartamento.SelectedValue));
        }

        protected void DdlProvinciaSelectedIndexChanged(object sender, EventArgs e)
        {
            LoadDistritos(Convert.ToInt32(ddlProvincia.SelectedValue));
        }

        protected void BtnGuardarClick(object sender, EventArgs e)
        {
            GuardarAccion();
        }

        private void LoadDepartamentos()
        {
            var departamentos = DepartamentoManager.Instancia.Listar(true);
            BindControl<DTO.Departamento>.BindDropDownList(ddlDepartamento, departamentos);
            if (departamentos.Count == 0) return;
            LoadProvincias(departamentos.First().IdDepartamento);
        }

        private void LoadProvincias(int idDepartamento)
        {
            var provincias = ProvinciaManager.Instancia.ListarPorIdDepartamento(idDepartamento);
            BindControl<DTO.Provincia>.BindDropDownList(ddlProvincia, provincias);
            if (provincias.Count == 0) return;
            LoadDistritos(provincias.First().IdProvincia);
        }

        private void LoadDistritos(int idProvincia)
        {
            var distritos = DistritoManager.Instancia.ListarPorIdProvincia(idProvincia);
            BindControl<DTO.Distrito>.BindDropDownList(ddlDistrito, distritos);
        }

        private void CargarAccion()
        {
            var accion = Request.QueryString.Get("Accion");
            if (string.IsNullOrEmpty(accion))
                Response.Redirect("Clientes.aspx", true);

            switch (accion)
            {
                case "I":
                    litAccion.Text = @"INGRESAR";
                    break;
                case "M":
                    var idCliente = Convert.ToInt32(Request.QueryString.Get("idCliente"));
                    CargarCliente(idCliente);
                    litAccion.Text = @"MODIFICAR";
                    break;
            }
        }

        private void CargarCliente(int idCliente)
        {
            var cliente = ClienteManager.Instancia.Obtener(idCliente);
            var user = Membership.GetUser(cliente.Dni);

            txtApellidos.Text = cliente.Apellidos;
            txtCelular.Text = cliente.Celular;
            txtDireccion.Text = cliente.Direccion;
            txtEmail.Text = cliente.Email;
            txtFechaNacimiento.Text = cliente.FechaNacimiento.ToString("dd/MM/yyyy");
            txtNombres.Text = cliente.Nombre;
            txtNumeroDocumento.Text = cliente.Dni;
            txtRuc.Text = cliente.Ruc;
            txtRazonSocial.Text = cliente.RazonSocial;
            txtOcupacion.Text = cliente.Ocupacion;
            txtTelefono.Text = cliente.Telefono;
            rblSexo.SelectedValue = cliente.Sexo;

            var distrito = DistritoManager.Instancia.Obtener(cliente.Distrito.IdDistrito);
            var provincia = ProvinciaManager.Instancia.Obtener(distrito.Provincia.IdProvincia);
            LoadProvincias(provincia.Departamento.IdDepartamento);
            LoadDistritos(provincia.IdProvincia);

            ddlDepartamento.SelectedValue = provincia.Departamento.IdDepartamento.ToString();
            ddlProvincia.SelectedValue = provincia.IdProvincia.ToString();
            ddlDistrito.SelectedValue = cliente.Distrito.IdDistrito.ToString();

            if (!string.IsNullOrEmpty(cliente.Foto))
                imgFoto.ImageUrl = cliente.Foto;
        }

        private void GuardarAccion()
        {
            var accion = Request.QueryString.Get("Accion");
            switch (accion)
            {
                case "I":
                    InsertarCliente();
                    break;
                case "M":
                    ModificarCliente();
                    break;
            }
        }

        private void InsertarCliente()
        {
            var username = txtNumeroDocumento.Text;
            var password = txtNumeroDocumento.Text;
            var email = txtEmail.Text;
            var user = Membership.CreateUser(username, password, email);
            Roles.AddUserToRole(username, "Cliente");

            var cliente = new DTO.Cliente
            {
                Apellidos = txtApellidos.Text.Trim(),
                Celular = txtCelular.Text.Trim(),
                Direccion = txtDireccion.Text.Trim(),
                Dni = txtNumeroDocumento.Text.Trim(),
                Email = txtEmail.Text.Trim(),
                FechaNacimiento = GetCurrentDatetime(txtFechaNacimiento.Text.Trim()),
                Foto = string.Empty,
                Distrito = new DTO.Distrito { IdDistrito = Convert.ToInt32(ddlDistrito.SelectedValue) },
                Nombre = txtNombres.Text.Trim(),
                Ocupacion = txtOcupacion.Text.Trim(),
                Ruc = txtRuc.Text.Trim(),
                RazonSocial = txtRazonSocial.Text.Trim(),
                Sexo = rblSexo.SelectedItem.Text.Substring(0, 1),
                Telefono = txtTelefono.Text.Trim(),
                UserID = (Guid)user.ProviderUserKey
            };
            if (fuFoto.HasFile)
            {
                var filename = Server.MapPath(ConfigurationManager.AppSettings["Foto"]) + user.UserName + Path.GetExtension(fuFoto.FileName);
                fuFoto.SaveAs(filename);
                cliente.Foto = filename;
            }
            try
            {
                ClienteManager.Instancia.Agregar(cliente);
                ClientScript.RegisterStartupScript(GetType(), "mostrar1", "alert('Registro grabado satisfactoriamente');window.location = 'Clientes.aspx';", true);
            }
            catch
            {
                ClientScript.RegisterStartupScript(GetType(), "mostrar", "alert('El Registro no se pudo grabar, intente de nuevo o más tarde.');", true);
            }
        }

        private void ModificarCliente()
        {
            var idCliente = Convert.ToInt32(Request.QueryString.Get("idCliente"));
            var cliente = ClienteManager.Instancia.Obtener(idCliente);
            var user = Membership.GetUser(cliente.Dni);

            cliente.Apellidos = txtApellidos.Text.Trim();
            cliente.Celular = txtCelular.Text.Trim();
            cliente.Direccion = txtDireccion.Text.Trim();
            cliente.Dni = txtNumeroDocumento.Text.Trim();
            cliente.Email = txtEmail.Text.Trim();
            if (user.Email != cliente.Email) user.Email = cliente.Email;
            cliente.FechaNacimiento = GetCurrentDatetime(txtFechaNacimiento.Text.Trim());
            if (fuFoto.HasFile)
            {
                var filename = Server.MapPath(ConfigurationManager.AppSettings["Foto"]) + user.UserName + Path.GetExtension(fuFoto.FileName);
                fuFoto.SaveAs(filename);
                cliente.Foto = filename;
            }
            cliente.Distrito.IdDistrito = Convert.ToInt32(ddlDistrito.SelectedValue);
            cliente.Nombre = txtNombres.Text.Trim();
            cliente.Ocupacion = txtOcupacion.Text.Trim();
            cliente.Ruc = txtRuc.Text.Trim();
            cliente.RazonSocial = txtRazonSocial.Text.Trim();
            cliente.Sexo = rblSexo.SelectedItem.Text.Substring(0, 1);
            cliente.Telefono = txtTelefono.Text.Trim();
            
            try
            {
                ClienteManager.Instancia.Modificar(cliente);
                ClientScript.RegisterStartupScript(GetType(), "mostrar2", "alert('Registro grabado satisfactoriamente');window.location = 'Clientes.aspx';", true);
            }
            catch
            {
                ClientScript.RegisterStartupScript(GetType(), "mostrar", "alert('El Registro no se pudo grabar, intente de nuevo o más tarde.');", true);
            }
        }
    }
}
